/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

import Negocio.Cola.Cola;
import Negocio.Cola.Contenedor;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Ivan
 */
public class AAsterisco extends MetodoBusqueda{
    private Cola<Hoja> abierto;
    private Contenedor<Hoja> cerrado;
    private Hoja primero_mejor;

    public AAsterisco() {
        abierto=new Cola<Hoja>();
        cerrado=new Contenedor<Hoja>();
        primero_mejor=null;
    }

    @Override
    public List<Estado> obtenerOptimo() {
        List<Estado> optimo=new ArrayList<Estado>();
        List<Hoja> camino=arbol.getCaminoOptimo();

        for(int i=0; i<camino.size();i++){
            optimo.add(camino.get(i).getEstado());
        }
        return optimo;
    }

    @Override
    public void procesar() {
//         cargarArbol(7);
        iniciarArbol();
        Hoja raiz=arbol.getRaiz();
        abierto.limpiar();
        cerrado.limpiar();
        abierto.insertar(raiz);


        do{
            try {
                primero_mejor = abierto.eliminar();
            } catch (Exception ex) { }

            cerrado.insertar(primero_mejor);
            arbol.cargarHijosDinamico(primero_mejor);
            
            List<Hoja> hijos=primero_mejor.getHijos();

            for(int i=0;i<hijos.size();i++){
                abierto.insertarOrdenado(hijos.get(i));
            }

        }while(!primero_mejor.esEstadoFinal());

        List<Hoja> optimo=arbol.getCaminoOptimo();
        optimo.clear();
        Hoja temp=cerrado.getUltimo();
        temp.setEsCamino(true);
        optimo.add(0,temp);

       while(temp.getPadre()!=null){
           temp=temp.getPadre();
           temp.setEsCamino(true);
           optimo.add(0,temp);
       }
      
    }

    @Override
    public void obtenerMetrica(Hoja estado) {
        estado.getEstado().calcularMetricaAAesterisco(estado.getNivelHoja(), estadoFinal);
    }

    @Override
    public List<Estado> resolucionAutomatica() {
        return this.obtenerOptimo();
    }

//    @Override
//    public void obtenerMetrica(Estado estado) {
////        estado.calcularMetrica(estadoFinal);
//
//        estado.calcularMetrica(estadoFinal);
//    }

    @Override
    public String toString() {
        return "A*";
    }
}